﻿namespace Yunzuan.Foundation.SerialNumber
{
    /// <summary>
    /// 注册码
    /// </summary>
    //public sealed class MachineCode
    //{
    //    private static MachineCode instance = new MachineCode();

    //    static MachineCode()
    //    {
    //        UpdateSerialNumber();
    //    }

    //    /// <summary>
    //    /// 验证
    //    /// </summary>
    //    public static void Check()
    //    {
    //        if (!IsSerialNumberValid)
    //        {
    //            throw new Exception("注册码无效");
    //        }
    //        else if (SerialNumberEndTime < DateTime.Today)
    //        {
    //            throw new Exception("注册码已过期");
    //        }
    //    }

    //    #region DES
    //    #region 密钥
    //    private static string key = "YUNZUAN1";//密钥(长度必须8位以上)   
    //    #endregion

    //    #region DES加密
    //    private string EncryptString(string pToEncrypt)
    //    {
    //        DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    //        byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);


    //        des.Key = UTF8Encoding.UTF8.GetBytes(key);
    //        des.IV = UTF8Encoding.UTF8.GetBytes(key);
    //        MemoryStream ms = new MemoryStream();
    //        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);

    //        cs.Write(inputByteArray, 0, inputByteArray.Length);
    //        cs.FlushFinalBlock();

    //        StringBuilder ret = new StringBuilder();
    //        foreach (byte b in ms.ToArray())
    //        {
    //            ret.AppendFormat("{0:X2}", b);
    //        }
    //        ret.ToString();
    //        return ret.ToString();
    //    }
    //    #endregion

    //    #region DES解密
    //    private string DecryptString(string pToDecrypt)
    //    {
    //        DESCryptoServiceProvider des = new DESCryptoServiceProvider();

    //        byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
    //        for (int x = 0; x < pToDecrypt.Length / 2; x++)
    //        {
    //            int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
    //            inputByteArray[x] = (byte)i;
    //        }

    //        des.Key = UTF8Encoding.UTF8.GetBytes(key);
    //        des.IV = UTF8Encoding.UTF8.GetBytes(key);
    //        MemoryStream ms = new MemoryStream();
    //        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
    //        cs.Write(inputByteArray, 0, inputByteArray.Length);
    //        cs.FlushFinalBlock();

    //        StringBuilder ret = new StringBuilder();

    //        return Encoding.UTF8.GetString(ms.ToArray());
    //    }
    //    #endregion 
    //    #endregion

    //    #region 注册码验证

    //    public static DateTime SerialNumberEndTime { private set; get; }
    //    public static bool IsSerialNumberValid { private set; get; }
    //    public static string Code { private set; get; }

    //    private static readonly object lockHelper = new object();
    //    public static void UpdateSerialNumber()
    //    {
    //        lock (lockHelper)
    //        {
    //            try
    //            {
    //                string mc = instance.GetMachineCode();
    //                Code = mc;

    //                string licenseFilePath = AppDomain.CurrentDomain.BaseDirectory + "\\License\\" + "sn.cs";
    //                if (!File.Exists(licenseFilePath))
    //                {
    //                    IsSerialNumberValid = false;
    //                    SerialNumberEndTime = DateTime.MinValue;
    //                }
    //                else
    //                {

    //                    string sn = string.Empty;
    //                    string company = string.Empty;
    //                    using (StreamReader sr = new StreamReader(licenseFilePath, System.Text.Encoding.UTF8))
    //                    {
    //                        string line = sr.ReadLine();
    //                        sn = line.Substring(2);
    //                        line = sr.ReadLine();
    //                        company = line.Substring(2);
    //                    }

    //                    IsSerialNumberValid = instance.IsValid(sn, mc, company);
    //                    SerialNumberEndTime = instance.GetValidDate(sn, mc, company);
    //                }
    //            }
    //            catch { }
    //        }
    //    }

    //    //public string GetSerialNumber(string mc, string dt, string fun, string company)
    //    //{
    //    //    //注册码：总计32位 xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx
    //    //    //时间前4位 + 机器码加密前4位 + "-" + 时间5-8位 + 机器码加密5-8位 + "-" + 时间9-12位 + 功能代码4位 + "-" + 时间13-16位 + 校验码4位
    //    //    //时间 = DES(年2位+月2位+日2位)总计6位，返回16位
    //    //    //机器码加密 = MD5(DES(机器码+"YUNZUAN"+公司名称))前8位
    //    //    //功能代码 = 8192(2进制功能复选结果)
    //    //    //校验位 = MD5(DES(时间+"YUNZUAN"+机器码+"YUNZUAN"+功能))前4位

    //    //    string machineCode = mc;
    //    //    string codeEndTime = this.EncryptString(dt).Substring(0, 16);
    //    //    string codeMachineCode = MD5Secret(EncryptString(machineCode + "YUNZUAN" + company)).Substring(0, 8);
    //    //    string codeFunc = fun;
    //    //    string codeValid = MD5Secret(EncryptString(dt + "YUNZUAN" + machineCode + "YUNZUAN" + fun)).Substring(0, 4);

    //    //    StringBuilder result = new StringBuilder();
    //    //    result.Append(codeEndTime.Substring(0, 4));
    //    //    result.Append(codeMachineCode.Substring(0, 4));
    //    //    result.Append("-");
    //    //    result.Append(codeEndTime.Substring(4, 4));
    //    //    result.Append(codeMachineCode.Substring(4, 4));
    //    //    result.Append("-");
    //    //    result.Append(codeEndTime.Substring(8, 4));
    //    //    result.Append(fun.PadLeft(4, '0'));
    //    //    result.Append("-");
    //    //    result.Append(codeEndTime.Substring(12));
    //    //    result.Append(codeValid);
    //    //    return result.ToString();
    //    //}

    //    public bool IsValid(string sn, string mc, string company)
    //    {
    //        try
    //        {
    //            string codeValid = MD5Secret(EncryptString(this.GetValidDateWithoutCheck(sn).ToString("yyyyMMdd").Substring(2) + "YUNZUAN" + mc + "YUNZUAN" + this.GetFunctionWithoutCheck(sn))).Substring(0, 4);
    //            if (codeValid != sn.Substring(sn.Length - 4))
    //            {
    //                return false;
    //            }

    //            string codeMachineCode = MD5Secret(EncryptString(mc + "YUNZUAN" + company)).Substring(0, 8);
    //            if (codeMachineCode != sn.Substring(4, 4) + sn.Substring(13, 4))
    //            {
    //                return false;
    //            }

    //            return true;
    //        }
    //        catch
    //        {
    //            return false;
    //        }
    //    }

    //    public DateTime GetValidDate(string sn, string mc, string company)
    //    {
    //        if (this.IsValid(sn, mc, company))
    //        {
    //            return this.GetValidDateWithoutCheck(sn);
    //        }
    //        return DateTime.MinValue;
    //    }

    //    private DateTime GetValidDateWithoutCheck(string sn)
    //    {
    //        try
    //        {
    //            if (sn.Length != 35)
    //            {
    //                return DateTime.Now.AddDays(-1);
    //            }
    //            string code = sn.Substring(0, 4) + sn.Substring(9, 4) + sn.Substring(18, 4) + sn.Substring(sn.Length - 8, 4);
    //            string dt = this.DecryptString(code);
    //            DateTime result = DateTime.Parse("20" + dt.Substring(0, 2) + "-" + dt.Substring(2, 2) + "-" + dt.Substring(4));
    //            return result;
    //        }
    //        catch
    //        {
    //            return DateTime.MinValue;
    //        }
    //    }

    //    public string GetFunction(string sn, string mc, string company)
    //    {
    //        if (this.IsValid(sn, mc, company))
    //        {
    //            return this.GetFunctionWithoutCheck(sn);
    //        }
    //        return "0000";
    //    }

    //    private string GetFunctionWithoutCheck(string sn)
    //    {
    //        if (sn.Length != 35)
    //        {
    //            return "0000";
    //        }
    //        return sn.Substring(sn.Length - 13, 4);
    //    }

    //    #endregion

    //    #region 生成机器码
    //    /// <summary>
    //    /// 生成机器码
    //    /// </summary>
    //    /// <returns></returns>
    //    public string GetMachineCode()
    //    {
    //        bool flag = false;
    //        string cpu;
    //        string netcard;
    //        try
    //        {
    //            cpu = this.GetCpuInfo();
    //            netcard = this.GetMoAddress();
    //        }
    //        catch
    //        {
    //            cpu = netcard = AppDomain.CurrentDomain.BaseDirectory;
    //            flag = true;
    //        }

    //        StringBuilder builder = new StringBuilder();
    //        string temp = this.Compute(cpu + "YUNZUAN" + netcard, 16);
    //        for (int i = 0; i < temp.Length && i < 16; i++)
    //        {
    //            if (i > 0 && i % 4 == 0)
    //            {
    //                builder.Append("-");
    //            }
    //            builder.Append(temp[i]);
    //        }
    //        if (flag)
    //        {
    //            return "D" + builder.ToString().Substring(1);
    //        }
    //        return builder.ToString();
    //    }

    //    private string Compute(string input, int length)
    //    {
    //        StringBuilder builder = new StringBuilder();
    //        string temp = this.MD5Secret(input + "YUNZUAN");
    //        for (int i = 0; i < temp.Length; i++)
    //        {
    //            if (temp[i] < 58)
    //            {
    //                builder.Append(temp[i]);
    //            }
    //        }
    //        if (builder.Length < length)
    //        {
    //            builder.Append(this.Compute(builder.ToString(), length));
    //        }
    //        return builder.ToString();
    //    } 
    //    #endregion

    //    private string MD5Secret(string source)
    //    {
    //        MD5 md5 = System.Security.Cryptography.MD5CryptoServiceProvider.Create();
    //        byte[] bs = System.Text.UnicodeEncoding.UTF8.GetBytes(source);
    //        bs = md5.ComputeHash(bs);
    //        return BitConverter.ToString(bs).Replace("-", "");
    //    }

    //    #region 硬件序列号
    //    ///<summary>    
    //    ///获取cpu序列号        
    //    ///</summary>    
    //    ///<returns> string </returns>
    //    private string GetCpuInfo()
    //    {
    //        string cpuInfo = " ";
    //        using (ManagementClass cimobject = new ManagementClass("Win32_Processor"))
    //        {
    //            ManagementObjectCollection moc = cimobject.GetInstances();
    //            foreach (ManagementObject mo in moc)
    //            {
    //                cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
    //                mo.Dispose();
    //            }
    //        }
    //        return cpuInfo.ToString();
    //    }

    //    ///<summary>    
    //    ///获取网卡硬件地址    
    //    ///</summary>    
    //    ///<returns> string </returns>
    //    private string GetMoAddress()
    //    {
    //        string MoAddress = " ";
    //        using (ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
    //        {
    //            ManagementObjectCollection moc2 = mc.GetInstances();
    //            foreach (ManagementObject mo in moc2)
    //            {
    //                if ((bool)mo["IPEnabled"] == true)
    //                    MoAddress = mo["MacAddress"].ToString();
    //                mo.Dispose();
    //            }
    //        }
    //        return MoAddress.ToString();
    //    } 
    //    #endregion

    //}
}
